/*
 * Copyright (c) 2025 Industrial Software Feature Database
 */
package com.comac.ins.isfd.domain.vo;

import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.comac.ins.common.core.exception.base.BaseException;
import com.comac.ins.isfd.constant.enums.IsfdLargeFileStatusEnum;
import com.comac.ins.isfd.constant.enums.IsfdLargeFileTypeEnum;
import com.comac.ins.isfd.constant.enums.PartFileSizeUnitEnum;
import com.comac.ins.isfd.domain.IsfdLargeFile;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;

import java.io.Serial;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;


/**
 * 要素数据大文件视图对象 isfd_large_file
 *
 * @author hxloongs
 * @date 2025-03-25
 */
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = IsfdLargeFile.class)
public class IsfdLargeFileVo implements Serializable {

    @Serial
    private static final long serialVersionUID = 1L;

    /**
     * 主键
     */
    @ExcelProperty(value = "主键")
    private String uploadId;

    /**
     * 上传时刻的时间戳
     */
    @ExcelProperty(value = "上传时刻的时间戳")
    private Long uploadTime;

    /**
     * 上传时刻的字符串
     */
    private String uploadTimeString;
    public String getUploadTimeString() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        if (uploadTime == null) {
            return "无上传时间";
        }
        try {
            // 将时间戳转换为 Date 对象
            Date date = new Date(uploadTime);
            // 格式化 Date 对象为指定的日期字符串
            return sdf.format(date);
        } catch (Exception e) {
            throw new BaseException("上传时间转换失败！");
        }
    }

    /**
     * 文件类型
     * @see IsfdLargeFileTypeEnum
     */
    @ExcelProperty(value = "文件类型")
    private String type;

    /**
     * 文件全名
     */
    @ExcelProperty(value = "文件全名")
    private String fullFileName;

    /**
     * 文件名
     */
    @ExcelProperty(value = "文件名")
    private String fileName;

    /**
     * 文件大小
     */
    @ExcelProperty(value = "文件大小")
    private Long fileSize;

    /**
     * 文件大小携带单位
     */
    private String fileSizeWithUnit;

    public String getFileSizeWithUnit() {
        return PartFileSizeUnitEnum.getFileSizeWithUnit(fileSize);
    }

    /**
     * 文件后缀
     */
    @ExcelProperty(value = "文件后缀")
    private String fileSuffix;

    /**
     * 存储地址
     */
    @ExcelProperty(value = "存储地址")
    private String fileUrl;

    /**
     * 文件哈希值
     */
    @ExcelProperty(value = "文件哈希值")
    private String fileHash;

    /**
     * 分片大小
     */
    @ExcelProperty(value = "分片大小")
    private Long chunkSize;
    /**
     * 总分片数
     */
    private Integer totalChunks;

    public Integer getTotalChunks() {
        // 判空和有效性检查
        if (fileSize == null || chunkSize == null || chunkSize == 0) {
            throw new IllegalArgumentException("文件大小或分块大小无效");
        }

        return (int) Math.ceil((double) fileSize / chunkSize);
    }

    /**
     * 文件上传状态,0-未完成，可继续上传；1-上传成功；2-上传失败
     *
     * @see IsfdLargeFileStatusEnum
     */
    private Integer status;

    /**
     * 创建人
     */
    @ExcelProperty(value = "创建人")
    private Integer createBy;

    private String createByName;

    /**
     * 创建时间
     */
    @ExcelProperty(value = "创建时间")
    private Date createTime;
}
